Python2 for beginners (P4B)

Luca Ferroni

http://www.befair.it
**Software Libero per i territori**

CAPITOLO 1: base

Installazione su Windows

  • Python con Anaconda (v. sito ufficiale di python), per ottenere:
    • l'interprete python e l'installatore di pacchetti pip
    • la shell interattiva IPython
  • Un editor di testo, consigliati:
    • Notepad++
    • Eclipse
    • PyCharm
    • Atom
    • Visual Code

Python's mantras

WARNING

  • Python non si riferisce al serpente
  • Ma al Monthy Python Flying Circus

E ora... "The hello tour!"

Il mio primo codice python


In [1]:
# This is hello_who.py

def hello(who):
    print("Hello {}!".format(who))

if __name__ == "__main__":
    hello("mamma")


Hello mamma!

IPython compagno di sviluppo

$ ipython
Python 2.7.12 (default, Jun 28 2016, 08:31:05) Type "copyright", "credits" or "license" for more information. IPython 5.0.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: %run hello_who.py Hello mamma! In [2]: !cat src/hello_who.py def hello(who): print("Hello {}!".format(who)) if __name__ == "__main__": hello("mamma")

Tip: scopri lo Zen di Python PEP 20


In [2]:
# This is hello_who.py                # <-- i commenti iniziano con `#`
                                      #     possono essere all'inizio o a fine riga
def hello(who):                       # <-- la funzione di definisce con `def`
    print("Hello {}!".format(who))    # <-- la stampa con `print` e le stringhe con `format`

if __name__ == "__main__":            # <-- [verifica di esecuzione e non di import](https://docs.python.org/2/library/__main__.html)
    hello("mamma")                    # <-- invoco la funzione con il valore


Hello mamma!

La leggibilità conta

  • Le linee guida di stile sono nel PEP 8
    • ogni azienda può averne di differenti

Le classiche sono:

  • Indentazione con 4 spazi, e non <TAB>: settate il vostro editor!
  • Lunghezza della riga <= 79 caratteri
  • Spazi intorno agli operatori

Le convenzioni per le docstring sono descritte nel PEP 257 in particolare:

  • Se monolinea scrivere tutto su una riga
  • Se multilinea il separatore finale (""") deve essere su una linea separata.

Mie convenzioni:

  • classi CamelCase e funzioni + variabili minuscole con _
  • il codice è scritto in inglese, in particolare i nomi delle variabili

I tipi di dato

  • numeri
  • stringhe
  • tuple: (1, 2 "a", "prova")
  • set: { 2, 4, 6,"a", 123 }
  • liste: [1,2,3,10,"a", -12.333]
  • dizionari: { "nome": "Luca", "cognome": "Ferroni"} -> è una tabella chiave:valore

Cicli e strutture di controllo


In [9]:
import random


def check_value_and_multiply(n, m):
    """
    Verifica il valore di n in un intervallo
    e lo moltiplica per m.
    
    Se n > 30 allora restituisce un codice di errore in un numero negativo.
    
    ATTENZIONE: non è bene usare codici di errore nello stesso canale dove
    sarebbero arrivati i dati corretti, si useranno in futuro le eccezioni.
    Ora ci serve come esempio.
    """
    if n < 10:
        print("n minore di 10")
    elif n > 30:  # elif per gestire else+if, questo sostiuisce anche lo switch/case
        print("n troppo grande")
        n = -1
    else:
        print("un buon valore di n = {}".format(n))
        
    return n*m
    

def main():
    while True:
        print("stiamo sorteggiando n")
        n = random.randint(1, 50)
        rv = check_value_and_multiply(n, 3)
        print("Il risultato è = {}".format(rv))
        if rv < 0:
            print("Codice di errore {} rilevato".format(rv))
            break
        
    
# if __name__ == "__main___":
# ATTENZIONE disabilito l'if perché nel notebook web non funziona ma voi lo dovete mettere
main()


stiamo sorteggiando n
un buon valore di n=22
Il risultato è =66
stiamo sorteggiando n
un buon valore di n=26
Il risultato è =78
stiamo sorteggiando n
n minore di 10
Il risultato è =9
stiamo sorteggiando n
un buon valore di n=17
Il risultato è =51
stiamo sorteggiando n
n troppo grande
Il risultato è =-3
Codice di errore -3 rilevato

DYI: La funzione di Fibonacci

Implementare la funzione di Fibonacci


In [ ]:
fib(0) --> 0
fib(1) --> 1
fib(2) --> 1
fib(3) --> 2
fib(n) --> fib(n-1) + fib(n-2)

Unittest: codice che testa la funzione per noi


In [11]:
import unittest

from fibo import calc_fibo

class TestMyFibo(unittest.TestCase):

    def test_base(self):
        self.assertEqual(calc_fibo(0), 0)
        self.assertEqual(calc_fibo(1), 1)

    def test_fibo_small(self):
        self.assertEqual(calc_fibo(6), 8)
        self.assertEqual(calc_fibo(8), 21)
        
    def test_fibo_big(self):
        self.assertEqual(calc_fibo(20), 6765)
        self.assertEqual(calc_fibo(30), 832040)

    def test_negative(self):
        with self.assertRaises(ValueError):
            calc_fibo(-1)
    
    def test_string(self):
        with self.assertRaises(TypeError):
            calc_fibo("ciao")
            calc_fibo("12")

if __name__ == '__main__':
    unittest.main()

Py.test: un'altra suite per il testing


In [ ]:
import pytest
from myprogram import fib

def test_fib_ok_small():
    assert fib(0) == 0
    assert fib(1) == 1
    assert fib(2) == 1
    assert fib(3) == 2
    
def test_fib_raise_if_string():
    with pytest.raises(TypeError):
        fib("a")

def test_fib_raises_lt_zero():
    with pytest.raises(ValueError):
        fib(-1)